package com.qls.web.modules.op.controller;

import cn.hutool.json.JSONObject;
import com.alibaba.fastjson.JSON;
import com.qls.core.constant.Constant;
import com.qls.core.dto.PushRpBody;
import com.qls.core.entity.OpGroup;
import com.qls.core.entity.OpOurRateplan;
import com.qls.core.entity.OpOurRateplanPrice;
import com.qls.core.entity.OpTaskStatus;
import com.qls.core.utils.R;
import com.qls.rabbitmq.SendMsg;
import com.qls.redis.RedisUtil;
import com.qls.web.common.annotation.SysLog;
import com.qls.web.common.utils.PageUtils;
import com.qls.web.modules.ht.service.HtLogicRoomService;
import com.qls.web.modules.op.service.GroupService;
import com.qls.web.modules.op.service.OpOurRateplanPriceService;
import com.qls.web.modules.op.service.OurRateplanService;
import com.qls.web.modules.op.service.TaskStatusService;
import com.qls.web.modules.sys.controller.AbstractController;
import com.qls.web.modules.vo.RateplanVOPrice;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.*;


/**
 * @author yj
 * @email yj@gmail.com
 * @date 2021-09-03 15:24:16
 */
@RestController
@RequestMapping("op/ourrateplan")
public class OurRateplanController extends AbstractController {

    @Autowired
    private OurRateplanService ourRateplanService;

    @Autowired
    private OpOurRateplanPriceService opOurRateplanPriceService;

    @Autowired
    private HtLogicRoomService htLogicRoomService;

    @Autowired
    private SendMsg sendMsg;

    @Autowired
    private GroupService groupService;

    @Autowired
    private RedisUtil redisUtil;

    @Autowired
    private TaskStatusService taskStatusService;


    /**
     * 列表
     */
    @SysLog("查询")
    @RequestMapping("/list")
    @RequiresPermissions("op:ourrateplan:list")
    public R list(@RequestParam Map<String, Object> params) {
        PageUtils page = ourRateplanService.sqlQueryPage(params);
        return R.ok().put("page", page);
    }


    /**
     * 信息
     */
    @RequestMapping("/info/{id}")
    @RequiresPermissions("op:ourrateplan:info")
    public R info(@PathVariable("id") Integer id) {
        OpOurRateplan ourRateplan = ourRateplanService.getById(id);
        List<OpOurRateplanPrice> opOurRateplanPriceEntities = opOurRateplanPriceService.getAllById(ourRateplan.getId());
        RateplanVOPrice rateplanVOPrice = new RateplanVOPrice();
        rateplanVOPrice.setOurRateplanPrices(opOurRateplanPriceEntities);
        rateplanVOPrice.setName(ourRateplan.getName());
        rateplanVOPrice.setId(ourRateplan.getId());
        rateplanVOPrice.setGroupId(ourRateplan.getGroupId());
        rateplanVOPrice.setDtId(ourRateplan.getDtId());
        rateplanVOPrice.setCount(ourRateplan.getCount());
        rateplanVOPrice.setChannel(ourRateplan.getChannel());
        rateplanVOPrice.setCancleType(ourRateplan.getCancleType());
        rateplanVOPrice.setCancleJsonStr(ourRateplan.getCancleJsonStr());
        rateplanVOPrice.setBreakfastNum(ourRateplan.getBreakfastNum());
        return R.ok().put("ourRateplan", rateplanVOPrice);
    }

    /**
     * 保存
     */
    @RequestMapping("/save")
    @RequiresPermissions("op:ourrateplan:save")
    public R save(@RequestBody RateplanVOPrice ourRateplan) {
        List<OpOurRateplanPrice> ourRateplanPrices = ourRateplan.getOurRateplanPrices();
        Integer breakfast = ourRateplan.getBreakfastNum();
        if (Objects.isNull(breakfast)) {
            ourRateplan.setBreakfastNum(-1);
        }
        ourRateplanService.save(ourRateplan);
        Integer id = ourRateplan.getId();
        for (OpOurRateplanPrice opOurRateplanPrice : ourRateplanPrices) {
            opOurRateplanPrice.setOurRpId(id);
            opOurRateplanPrice.setId(null);
        }
        opOurRateplanPriceService.saveOrUpdateBatch(ourRateplanPrices);
        redisUtil.hashSet(Constant.Redis.CRPID_USE_CPRICE.getValue(), id.toString(), ourRateplanPrices);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    @RequiresPermissions("op:ourrateplan:update")
    public R update(@RequestBody RateplanVOPrice ourRateplan) {
        Integer rateplanId = ourRateplan.getId();
        List<OpOurRateplanPrice> opOurRateplanPriceEntities2 = opOurRateplanPriceService.getAllById(rateplanId);
        // 保存新的加价
        List<OpOurRateplanPrice> opOurRateplanPriceEntities = new ArrayList<>();
        // 前端提交的加价 1 2
        List<OpOurRateplanPrice> opOurRateplanPriceEntities1 = ourRateplan.getOurRateplanPrices();
        OpOurRateplan opOurRateplan = new OpOurRateplan();
        opOurRateplan.setId(ourRateplan.getId());
        opOurRateplan.setCancleJsonStr(ourRateplan.getCancleJsonStr());
        opOurRateplan.setName(ourRateplan.getName());
        opOurRateplan.setChannel(ourRateplan.getChannel());
        opOurRateplan.setCancleType(ourRateplan.getCancleType());
        opOurRateplan.setBreakfastNum(ourRateplan.getBreakfastNum() == null ? -1 : ourRateplan.getBreakfastNum());
        ourRateplanService.updateById(opOurRateplan);
        // 判断list
        List<Integer> rpIdList = new ArrayList<>();
        for (OpOurRateplanPrice o1 : opOurRateplanPriceEntities1) {
            rpIdList.add(o1.getId());
            o1.setOurRpId(rateplanId);
            opOurRateplanPriceEntities.add(o1);
        }
        opOurRateplanPriceService.saveOrUpdateBatch(opOurRateplanPriceEntities1);
        for (OpOurRateplanPrice o2 : opOurRateplanPriceEntities2) {
            int id = o2.getId();
            if (!rpIdList.contains(id)) {
                opOurRateplanPriceService.removeById(id);
            }
        }
        redisUtil.hashSet(Constant.Redis.CRPID_USE_CPRICE.getValue(), rateplanId.toString(), opOurRateplanPriceEntities);
        return R.ok();
    }

    @GetMapping("/deleteRp")
    public R deleteRp(@RequestParam Map<String, Object> map) {
        Integer groupId = Integer.valueOf(map.get("groupId").toString());
        OpGroup opGroup = groupService.queryStoreIdById(groupId);
        Integer crpId = Integer.valueOf(map.get("crpId").toString());
        PushRpBody pushRpBody = new PushRpBody();
        List<Integer> crpIds = new ArrayList<>();
        crpIds.add(crpId);
        List<Long> rpCodes = htLogicRoomService.queryRpCodesByGroup(groupId);
        OpTaskStatus opTaskStatus = new OpTaskStatus();
        Integer taskCode = Integer.valueOf(System.currentTimeMillis() / 1000 + "");
        opTaskStatus.setTaskCode(taskCode);
        opTaskStatus.setTaskName("自定义rp删除");
        opTaskStatus.setStartTime(new Date());
        opTaskStatus.setTotal(rpCodes.size());
        opTaskStatus.setDtId(opGroup.getDtId());
        taskStatusService.save(opTaskStatus);
        rpCodes.add(-1L);
        for (Long rpCode : rpCodes) {
            pushRpBody.setCrpIds(crpIds);
            pushRpBody.setType(-1);
            pushRpBody.setStoreId(opGroup.getStoreId());
            pushRpBody.setRpCode(rpCode);
            pushRpBody.setTaskId(taskCode);
            sendMsg.execute(Constant.RabbitMq.RP, opGroup.getStoreId(), pushRpBody);
        }
        return R.ok();
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
    @RequiresPermissions("op:ourrateplan:delete")
    public R delete(@RequestBody Integer[] ids) {
        List<OpOurRateplan> opOurRateplanEntities = ourRateplanService.listByIds(Arrays.asList(ids));
        List<Integer> badList = new ArrayList<>();
        List<Integer> allList = new ArrayList<>(Arrays.asList(ids));
        for (OpOurRateplan ourRateplanEntity : opOurRateplanEntities) {
            int count = ourRateplanEntity.getCount();
            int id = ourRateplanEntity.getId();
            if (allList.contains(id)) {
                if (count > 0) {
                    badList.add(id);
                }
            }
        }
        allList.removeAll(badList);
        if (!allList.isEmpty()) {
            ourRateplanService.removeByIds(allList);
            // todo 删除数据库的自定义价格加幅
            opOurRateplanPriceService.delByOurRpIds(allList);
            String[] strings = new String[allList.size()];
            for (Integer v : allList) {
                strings[allList.indexOf(v)] = v.toString();
            }
            redisUtil.hashDel(Constant.Redis.CRPID_USE_CPRICE.getValue(), strings);
        }
        if (badList.isEmpty()) {
            return R.ok();
        }
        return R.error("id为" + badList.toString() + "删除失败");
    }

}
